#include <iostream>
#include <memory>
using namespace std;

/*
    智能指针：本质是个模板类的对象
        解决问题：在使用堆空间的时候，要主动使用free、delete释放堆空间
            C++创建了一个模板类，在类的构造函数和析构函数中申请和释放空间
            运算符重载+ 解引用和[]
*/

/*auto_ptr的源码
template <typename T>
class auto_ptr
{
    public:
    auto_ptr(T *ptr)
    {
        m_ptr = ptr;
    }
    ~auto_ptr()
    {
        delete m_ptr;
    }
    private:
    T *m_ptr;
};
*/

int main()
{
    // 创建auto_ptr类的对象
    auto_ptr<int> p1(new int);

    // auto_ptr模板类没有重载加法和[] 因此不能*(p1+1) =  78 ;p1[1]=78;
    // auto_ptr指针智能申请一个类型大小的空间，不能申请多个
    *p1 = 78;
    cout << *p1 << endl;

    return 0;
}